package com.it.bigdata.zookeeper;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import com.it.bigdata.mail.MyMail;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;

/**
 * 创建一个监视器，这个监视器需要实现watcher接口
 * 接口中有一个process方法。
 * 当监视器发现监视的节点发生变化的时候，这个process方法会被调用
 *
 *
 * 所以这个监视器是一个守护进程，也就是说一个永远不会停止的进程，类似于死循环
 *
 */
public class SpliderWatcher implements Watcher {
    //连接zk对象
    CuratorFramework client;
    //子节点集合
    List<String> childrenList;
    public SpliderWatcher() {
        //在这需要指定监视的节点
        //指定zk集群的地址
        String connectString = "node3:2181,node4:2181,node5:2181";
        // 重试策略： 1000 ：代表是重试时间间隔     3：表示是重试次数（连接zookeeper时使用）
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        //使用curator创建一个zk链接
        int sessionTimeoutMs = 2000;//这个值必须在4s--40s之间，表示是链接失效的时间
        int connectionTimeoutMs = 1000;//链接超时时间
        client = CuratorFrameworkFactory.newClient(connectString, sessionTimeoutMs , connectionTimeoutMs , retryPolicy);
        //System.out.println(this.getClass().getName());
        //启动链接(使用start方法开启事件监听)
        client.start();

        try {
            //使用spiderwatcher监视器监视spider节点下面的所有子节点的变化情况(向spider节点注册监视器，这个监视器需要重复重复注册)
            childrenList = client.getChildren().usingWatcher(this).forPath("/node11");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void process(WatchedEvent event) {
        try {
            //重复注册监视器
            List<String> newChildrenList = client.getChildren().usingWatcher(this).forPath("/node11");
            for (String node : childrenList) {
                if(!newChildrenList.contains(node)){
                    //给管理员发送短信，或者邮件
                    //发短信的话可以使用一些第三方平台 云片网
                    //发邮件的话使用  javamail*/
                    MyMail.sendMsg();
                }
            }
            //将子节点集合赋值给全局变量
            this.childrenList = newChildrenList;

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) throws IOException {
        SpliderWatcher spliderWatcher=new SpliderWatcher();
        //为了保证让这个方法一直运行,因为这是一个监视器，不可以挂掉
        System.in.read();
    }
}
